#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/1/19 13:41
# @Author  : Seven
# @File    : 1-filterDemo.py
# @Software: PyCharm
# function:  以Lena为原始图像，通过OpenCV实现平均滤波，高斯滤波及中值滤波，比较滤波结果。
import cv2
import numpy as np


def averageFilter(img):
    """
    均值滤波
    :param img:
    :return:
    """
    # 5*5的均值卷积核
    kernel = np.ones((5, 5), np.float32) / 25
    averageImage = cv2.filter2D(img, -1, kernel)
    cv2.imshow('average', averageImage)


def gaussFilter(img):
    """
    高斯滤波
    :param img:
    :return:
    """
    # 高斯平滑滤波
    # 5*5的高斯卷积核
    gaussImage = cv2.GaussianBlur(img, (5, 5), 0)
    cv2.imshow("gauss", gaussImage)


def medianFilter(img):
    """
    中值滤波
    :param img:
    :return:
    """
    # 中值滤波
    # 5*5的中值卷积核
    medianImage = cv2.medianBlur(img, 5)
    cv2.imshow("median", medianImage)


if __name__ == '__main__':
    image = cv2.imread('image/lena.jpg')
    image = cv2.pyrDown(image)
    cv2.imshow('source', image)
    # 均值滤波
    averageFilter(image)
    # 高斯滤波
    gaussFilter(image)
    # 中值滤波
    medianFilter(image)
    cv2.waitKey(0)

# 均值滤波采用线性的方法，平均整个窗口范围内的像素值，它不能很好地保护图像细节，
# 在图像去噪的同时也破坏了图像的细节部分，从而使图像变得模糊，不能很好地去除噪声点，均值滤波对高斯噪声表现较好，对椒盐噪声表现较差

# 中值滤波采用非线性的方法，它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘，
# 选择适当的点来替代污染点的值，所以处理效果好，对椒盐噪声表现较好，对高斯噪声表现较差。

# 高斯滤波能比较好地保留图像的低频和高频信息，并在保留图像信息和滤出噪声之间找到一个平衡点。
